/* 
假设 Andy 和 Doris 想在晚餐时选择一家餐厅，并且他们都有一个表示最喜爱餐厅的列表，每个餐厅的名字用字符串表示。

你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个，则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。


输入: list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"]，list2 = ["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]
输出: ["Shogun"]
解释: 他们唯一共同喜爱的餐厅是“Shogun”。


*/

/**
 * @param {string[]} list1
 * @param {string[]} list2
 * @return {string[]}
 */
var findRestaurant = function (list1, list2) {
    // const index = new Map();
    // for (let i = 0; i < list1.length; i++) {
    //     index.set(list1[i], i);
    // }

    // const ret = [];
    // let indexSum = Number.MAX_VALUE;
    // for (let i = 0; i < list2.length; i++) {
    //     if (index.has(list2[i])) {
    //         const j = index.get(list2[i]);
    //         if (i + j < indexSum) {
    //             ret.length = 0;
    //             ret.push(list2[i]);
    //             indexSum = i + j;
    //         } else if (i + j == indexSum) {
    //             ret.push(list2[i]);
    //         }
    //     }
    // }

    let map = new Map()
    let min = Number.MAX_VALUE, minVal = []
    // 记录索引
    for (let i = 0; i < list1.length; i++) {
        map.set(list1[i], i)
    }
    for (let j = 0; j < list2.length; j++) {
        if (map.has(list2[j])) {
            // 如果有更小的索引和
            if (min > map.get(list2[j]) + j) {
                minVal.length=0 // 清空输出数组
                minVal.push(list2[j]) // 获取此时的更小索引对应的值
            }else if(min === map.get(list2[j]) + j){
                // 索引一样小
                minVal.push(list2[j]) // 获取此时的更小索引对应的值
            }
            // 更新最小索引
            min = Math.min(min, map.get(list2[j]) + j)
        }
    }
    // console.log(minVal);
    return minVal;
};

let list1 = ["Shogun","Tapioca Express","Burger King","KFC"], list2 = ["KFC","Shogun","Burger King"]
findRestaurant(list1, list2)